/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package XML;

import com.thoughtworks.xstream.XStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import mundo.Mapa;
import objetos.personajes.*;
import objetos.*;

/** @author Miguel && Yanire && Cesar */
public final class XML_DeParser {

    public static void deserializacionPersonajes() {
	try {
	    XStream xs = new XStream();
	    FileReader fr = new FileReader("config/personajes.xml");
	    ArrayList<Personaje> personajes = (ArrayList<Personaje>) xs.fromXML(fr);
	    fr.close();

	    for (Personaje personaje : personajes) {
		switch (personaje.getTipoPersonaje()) {
		    case 0:
			ConstantesPersonajes.vidaPrincipal = personaje.getVidaMaxima();
			ConstantesPersonajes.costoPrincipal = personaje.getCosto();
			ConstantesPersonajes.manutencionPrincipal = personaje.getManutencion();
			ConstantesPersonajes.ataquePrincipal = personaje.getAtaquePropio();
			ConstantesPersonajes.defensaPrincipal = personaje.getDefensaPropia();
			ConstantesPersonajes.tipoPrincipal = personaje.getTipoPersonaje();
			break;
		    case 1:
			ConstantesPersonajes.vidaArtillero = personaje.getVidaMaxima();
			ConstantesPersonajes.costoArtillero = personaje.getCosto();
			ConstantesPersonajes.manutencionArtillero = personaje.getManutencion();
			ConstantesPersonajes.ataqueArtillero = personaje.getAtaquePropio();
			ConstantesPersonajes.defensaArtillero = personaje.getDefensaPropia();
			ConstantesPersonajes.tipoArtillero = personaje.getTipoPersonaje();
			break;
		    case 2:
			ConstantesPersonajes.vidaSoldadoDeCaballeria = personaje.getVidaMaxima();
			ConstantesPersonajes.costoSoldadoDeCaballeria = personaje.getCosto();
			ConstantesPersonajes.manutencionSoldadoDeCaballeria = personaje.getManutencion();
			ConstantesPersonajes.ataqueSoldadoDeCaballeria = personaje.getAtaquePropio();
			ConstantesPersonajes.defensaSoldadoDeCaballeria = personaje.getDefensaPropia();
			ConstantesPersonajes.tipoSoldadoDeCaballeria = personaje.getTipoPersonaje();
			break;
		    case 3:
			ConstantesPersonajes.vidaSoldadoDeInfanteria = personaje.getVidaMaxima();
			ConstantesPersonajes.costoSoldadoDeInfanteria = personaje.getCosto();
			ConstantesPersonajes.manutencionSoldadoDeInfanteria = personaje.getManutencion();
			ConstantesPersonajes.ataqueSoldadoDeInfanteria = personaje.getAtaquePropio();
			ConstantesPersonajes.defensaSoldadoDeInfanteria = personaje.getDefensaPropia();
			ConstantesPersonajes.tipoSoldadoDeInfanteria = personaje.getTipoPersonaje();
			break;
		    case 4:
			ConstantesPersonajes.vidaIndigena = personaje.getVidaMaxima();
			ConstantesPersonajes.costoIndigena = personaje.getCosto();
			ConstantesPersonajes.manutencionIndigena = personaje.getManutencion();
			ConstantesPersonajes.ataqueIndigena = personaje.getAtaquePropio();
			ConstantesPersonajes.defensaIndigena = personaje.getDefensaPropia();
			ConstantesPersonajes.tipoIndigena = personaje.getTipoPersonaje();
			break;
		    case 5:
			ConstantesPersonajes.vidaRabona = personaje.getVidaMaxima();
			ConstantesPersonajes.costoRabona = personaje.getCosto();
			ConstantesPersonajes.manutencionRabona = personaje.getManutencion();
			ConstantesPersonajes.ataqueRabona = personaje.getAtaquePropio();
			ConstantesPersonajes.defensaRabona = personaje.getDefensaPropia();
			ConstantesPersonajes.tipoRabona = personaje.getTipoPersonaje();
			ConstantesPersonajes.curacionRabona = ((Rabona) personaje).getCuracion();
			break;

		}
	    }

	} catch (IOException e) {
	    System.out.println(e.toString());
	}
    }

    public static InfoGeneral deserializacionInfoGeneral() {
	try {
	    XStream xs = new XStream();
	    FileReader fr = new FileReader("config/infogeneral.xml");
	    InfoGeneral info = (InfoGeneral) xs.fromXML(fr);
	    fr.close();
	    return info;
	} catch (IOException e) {
	    System.out.println(e.toString());
	}
	return null;
    }

    public static void deserializacionArmas() {
	try {
	    XStream xs = new XStream();
	    FileReader fr = new FileReader("config/armas.xml");
	    ArrayList<Arma> armas = (ArrayList<Arma>) xs.fromXML(fr);
	    fr.close();

	    for(Arma arma : armas){
		if (arma.getNombreArma().toUpperCase().equals(ConstantesArma.ESCUDO.toUpperCase())){
		    ConstantesArma.costoEscudo = arma.getCosto();
		    ConstantesArma.intEscudo = arma. getIntensidad();
		}

		if (arma.getNombreArma().toUpperCase().equals(ConstantesArma.LANZON.toUpperCase())){
		    ConstantesArma.costoLanzon = arma.getCosto();
		    ConstantesArma.intLanzon = arma. getIntensidad();
		}

		if (arma.getNombreArma().toUpperCase().equals(ConstantesArma.CANON.toUpperCase())){
		    ConstantesArma.costoCanon = arma.getCosto();
		    ConstantesArma.intCanon = arma. getIntensidad();
		}

		if (arma.getNombreArma().toUpperCase().equals(ConstantesArma.CABALLERIA.toUpperCase())){
		    ConstantesArma.costoCaballeria = arma.getCosto();
		    ConstantesArma.intCaballeria = arma. getIntensidad();
		}

		if (arma.getNombreArma().toUpperCase().equals(ConstantesArma.LANZA.toUpperCase())){
		    ConstantesArma.costoLanza = arma.getCosto();
		    ConstantesArma.intLanza = arma. getIntensidad();
		}

		if (arma.getNombreArma().toUpperCase().equals(ConstantesArma.FUSIL.toUpperCase())){
		    ConstantesArma.costoFusil = arma.getCosto();
		    ConstantesArma.intFusil = arma. getIntensidad();
		}

		if (arma.getNombreArma().toUpperCase().equals(ConstantesArma.BAYONETA.toUpperCase())){
		    ConstantesArma.costoBayoneta = arma.getCosto();
		    ConstantesArma.intBayoneta = arma. getIntensidad();
		}

		if (arma.getNombreArma().toUpperCase().equals(ConstantesArma.PIEDRAS.toUpperCase())){
		    ConstantesArma.costoPiedras = arma.getCosto();
		    ConstantesArma.intPiedras = arma. getIntensidad();
		}

		if (arma.getNombreArma().toUpperCase().equals(ConstantesArma.REJONES.toUpperCase())){
		    ConstantesArma.costoRejones = arma.getCosto();
		    ConstantesArma.intRejones = arma. getIntensidad();
		}

		if (arma.getNombreArma().toUpperCase().equals(ConstantesArma.HONDAS.toUpperCase())){
		    ConstantesArma.costoHondas = arma.getCosto();
		    ConstantesArma.intHondas = arma. getIntensidad();
		}
	    }


	} catch (IOException e) {
	    System.out.println(e.toString());
	}
    }

    //Añadido por Cesar

    public static void deseralizacionAldea() {
	try {
	    XStream xs = new XStream();
	    FileReader fr = new FileReader("config/aldea.xml");
	    AldeaXML aldea = (AldeaXML) xs.fromXML(fr);
	    fr.close();

	    Aldea.cantidadxArma = aldea.cantidadxCadaArma;
	    Aldea.cantidadxPersonaje = aldea.cantidadxCadaPersonaje;
	} catch (IOException e) {
	    System.out.println(e.toString());
	}
    }

    public static MapaXML deserializacionMapa(int nivel) {
	try {
	    XStream xs = new XStream();
	    FileReader fr = new FileReader("config/mapa"+nivel+".xml");
	    MapaXML mapa = (MapaXML) xs.fromXML(fr);
	    fr.close();
	    return mapa;
	} catch (IOException e) {
	    System.out.println(e.toString());
	}
	return null;
    }

    public static ArrayList<PersonajeXML> deserializacionBatallon(int bando, int nivel) {
	try {
	    XStream xs = new XStream();
	    FileReader fr = new FileReader("config/batallonN"+nivel+"B"+bando+".xml");
	    ArrayList<PersonajeXML> personajes = (ArrayList<PersonajeXML>) xs.fromXML(fr);
	    fr.close();

	    return personajes;
	} catch (IOException e) {
	    System.out.println(e.toString());
	}
	return null;
    }

    public static Bando generarBando(ArrayList<PersonajeXML> personajes, int tipoBando) {
        Bando bando = new Bando(tipoBando);

        //Variable auxiliar de cantidad a usarse para cada personaje
        int cant = 0;

        for (PersonajeXML personaje : personajes ) {
            int tipo = personaje.tipoPersonaje;
            switch(tipo){
                case 0: cant = personaje.cantidad;
                        for (int i =0; i<cant; ++i) {
                            PersonajePrincipal personajePrincipal = new PersonajePrincipal();
                            ArrayList<ArmaXML> armas = personaje.armas;
                            for (int j=0; j<armas.size(); ++j) {
                                ArmaXML arma = armas.get(j);
                                if (arma.tipoArma == 0)
                                    personajePrincipal.setArmaDefensa(new Arma(tipo, arma.tipoArma, arma.nombreArma));
                                else
                                    personajePrincipal.setArmaAtaque(new Arma(tipo, arma.tipoArma, arma.nombreArma));
                            }
                            bando.setPersonajePrincipal(personajePrincipal);
                            bando.agregarPersonaje(personajePrincipal);
                        }
                        break;
                case 1: cant = personaje.cantidad;
                        for (int i =0; i<cant; ++i) {
                            Artillero artillero = new Artillero();
                            ArrayList<ArmaXML> armas = personaje.armas;
                            for (int j=0; j<armas.size(); ++j) {
                                ArmaXML arma = armas.get(j);
                                if (arma.tipoArma == 0)
                                    artillero.setArmaDefensa(new Arma(tipo, arma.tipoArma, arma.nombreArma));
                                else
                                    artillero.setArmaAtaque(new Arma(tipo, arma.tipoArma, arma.nombreArma));
                            }
                            bando.agregarPersonaje(artillero);
                        }
                        break;
                case 2: cant = personaje.cantidad;
                        for (int i =0; i<cant; ++i) {
                            SoldadoDeCaballeria soldadoDeCaballeria = new SoldadoDeCaballeria();
                            ArrayList<ArmaXML> armas = personaje.armas;
                            for (int j=0; j<armas.size(); ++j) {
                                ArmaXML arma = armas.get(j);
                                if (arma.tipoArma == 0)
                                    soldadoDeCaballeria.setArmaDefensa(new Arma(tipo, arma.tipoArma, arma.nombreArma));
                                else
                                    soldadoDeCaballeria.setArmaAtaque(new Arma(tipo, arma.tipoArma, arma.nombreArma));
                            }
                            bando.agregarPersonaje(soldadoDeCaballeria);
                        }
                        break;
                case 3: cant = personaje.cantidad;
                        for (int i =0; i<cant; ++i) {
                            SoldadoDeInfanteria soldadoDeInfanteria = new SoldadoDeInfanteria();
                            ArrayList<ArmaXML> armas = personaje.armas;
                            for (int j=0; j<armas.size(); ++j) {
                                ArmaXML arma = armas.get(j);
                                if (arma.tipoArma == 0)
                                    soldadoDeInfanteria.setArmaDefensa(new Arma(tipo, arma.tipoArma, arma.nombreArma));
                                else
                                    soldadoDeInfanteria.setArmaAtaque(new Arma(tipo, arma.tipoArma, arma.nombreArma));
                            }
                            bando.agregarPersonaje(soldadoDeInfanteria);
                        }
                        break;
                case 4: cant = personaje.cantidad;
                        for (int i =0; i<cant; ++i) {
                            Indigena indigena = new Indigena();
                            ArrayList<ArmaXML> armas = personaje.armas;
                            for (int j=0; j<armas.size(); ++j) {
                                ArmaXML arma = armas.get(j);
                                if (arma.tipoArma == 0)
                                    indigena.setArmaDefensa(new Arma(tipo, arma.tipoArma, arma.nombreArma));
                                else
                                    indigena.setArmaAtaque(new Arma(tipo, arma.tipoArma, arma.nombreArma));
                            }
                            bando.agregarPersonaje(indigena);
                        }
                        break;
                case 5: cant = personaje.cantidad;
                        for (int i =0; i<cant; ++i) {
                            Rabona rabona = new Rabona();
                            ArrayList<ArmaXML> armas = personaje.armas;
                            for (int j=0; j<armas.size(); ++j) {
                                ArmaXML arma = armas.get(j);
                                if (arma.tipoArma == 0)
                                    rabona.setArmaDefensa(new Arma(tipo, arma.tipoArma, arma.nombreArma));
                                else
                                    rabona.setArmaAtaque(new Arma(tipo, arma.tipoArma, arma.nombreArma));
                            }
                            bando.agregarPersonaje(rabona);
                            bando.setNumRabonas(cant);
                        }
                        break;
            }
        }
        return bando;
    }

    public static Mapa generarMapa(MapaXML mapaXML, Bando bandoP, Bando bandoR){
        Mapa mapa = new Mapa(mapaXML.M,mapaXML.N, mapaXML.nombre);

        //agrega a matriz obstaculos y aldeas
        for (int i = 0; i<mapaXML.objetos.size(); i++)
            mapa.setCelda(mapaXML.objetos.get(i), bandoP, bandoR);


        //System.out.print("Bando Patriota [x,y]:"+bandoP.getPersonajePrincipal().getX()+" "+
                //bandoP.getPersonajePrincipal().getY()+"\n");

        //System.out.print("Bando Realista [x,y]:"+bandoR.getPersonajePrincipal().getX()+" "+
                //bandoR.getPersonajePrincipal().getY()+"\n");

        
        return mapa;
        
    }


}
